package com.ruiyian.system.service.impl;

import com.ruiyian.common.utils.DateUtils;
import com.ruiyian.system.domain.GPS;
import com.ruiyian.system.domain.GsdMapInfo;
import com.ruiyian.system.mapper.GsdMapInfoMapper;
import com.ruiyian.system.service.IGsdMapInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson2.JSON;

import java.util.ArrayList;
import java.util.List;

/**
 * 路线路段Service业务层处理
 *
 * @author ruoyi
 * @date 2024-04-17
 */
@Service
public class GsdMapInfoServiceImpl implements IGsdMapInfoService
{
    @Autowired
    private GsdMapInfoMapper gsdMapInfoMapper;

    /**
     * 查询路线路段
     *
     * @param roadId 路线路段主键
     * @return 路线路段
     */
    @Override
    public GsdMapInfo selectGsdMapInfoByRoadId(Long roadId)
    {
        return gsdMapInfoMapper.selectGsdMapInfoByRoadId(roadId);
    }

    /**
     * 查询路线路段列表
     *
     * @param gsdMapInfo 路线路段
     * @return 路线路段
     */
    @Override
    public List<GsdMapInfo> selectGsdMapInfoList(GsdMapInfo gsdMapInfo)
    {
        List<GsdMapInfo> gsdMapInfoList =  gsdMapInfoMapper.selectGsdMapInfoList(gsdMapInfo);
        setLngLatVO(gsdMapInfoList);
        return gsdMapInfoList;
    }

    //将字符串中的数据分割后重新设置为经纬度VO对象需要的格式
    private void setLngLatVO(List<GsdMapInfo> roadNameVOList) {
        for (GsdMapInfo roadNameVO : roadNameVOList) {
            ArrayList<Double[]> lngLatVO = new ArrayList<>();
            Double[] beginPoint = new Double[2];
            Double[] endPoint = new Double[2];
            if (null != roadNameVO.getLngLat()){
                //1.取出之前存入时转换成字符串的数据
                String gps = roadNameVO.getLngLat();
                //2.转换得到高德地图经纬度数据对象的list
                List<GPS> gpsList = JSON.parseArray(gps, GPS.class);
                //经度同起点的经度差值
                double lngDif = 0.0;
                //经度最远位置下标
                int lngIndex = 0;
                //纬度同起点的纬度差值
                double latDif = 0.0;
                //纬度最远位置下标
                int latIndex = 0;

                for (int i = 0; i < gpsList.size(); i++) {
                    //3.放入VO对象
                    lngLatVO.add(new Double[]{gpsList.get(i).getLng(),gpsList.get(i).getLat()});
                    //4.进行终点的判断，设置其经纬度
                    if (i == 0){
                        beginPoint = new Double[]{gpsList.get(0).getLng(),gpsList.get(0).getLat()};
                    }else {
                        //如果当前经度跟起点的经度差值与之前经纬度跟起点经纬度差值都大，则更新差值和终点值
                        if (Math.abs(gpsList.get(i).getLng() - beginPoint[0]) > lngDif){
                            lngDif =  Math.abs(gpsList.get(i).getLng() - beginPoint[0]);
                            lngIndex = i;
                        }
                        if (Math.abs(gpsList.get(i).getLat() - beginPoint[1]) > latDif){
                            latDif =  Math.abs(gpsList.get(i).getLat() - beginPoint[1]);
                            latIndex = i;
                        }
                    }
                }
                //经纬度差值谁大就取谁的下标位置的经纬度为终点经纬度
                endPoint = lngDif > latDif ? new Double[]{gpsList.get(lngIndex).getLng(),gpsList.get(lngIndex).getLat()} : new Double[]{gpsList.get(latIndex).getLng(),gpsList.get(latIndex).getLat()};
            }
            roadNameVO.setEndPoint(endPoint);
            roadNameVO.setLngLatVO(lngLatVO);
        }
    }

    /**
     * 新增路线路段
     *
     * @param gsdMapInfo 路线路段
     * @return 结果
     */
    @Override
    public int insertGsdMapInfo(GsdMapInfo gsdMapInfo)
    {
        gsdMapInfo.setCreateTime(DateUtils.getNowDate());
        return gsdMapInfoMapper.insertGsdMapInfo(gsdMapInfo);
    }

    /**
     * 修改路线路段
     *
     * @param gsdMapInfo 路线路段
     * @return 结果
     */
    @Override
    public int updateGsdMapInfo(GsdMapInfo gsdMapInfo)
    {
        gsdMapInfo.setUpdateTime(DateUtils.getNowDate());
        return gsdMapInfoMapper.updateGsdMapInfo(gsdMapInfo);
    }

    /**
     * 批量删除路线路段
     *
     * @param roadIds 需要删除的路线路段主键
     * @return 结果
     */
    @Override
    public int deleteGsdMapInfoByRoadIds(Long[] roadIds)
    {
        return gsdMapInfoMapper.deleteGsdMapInfoByRoadIds(roadIds);
    }

    /**
     * 删除路线路段信息
     *
     * @param roadId 路线路段主键
     * @return 结果
     */
    @Override
    public int deleteGsdMapInfoByRoadId(Long roadId)
    {
        return gsdMapInfoMapper.deleteGsdMapInfoByRoadId(roadId);
    }
}
